<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <script>
    // var b = 10;
    // (function b() {
    //   b = 20;
    //   console.log(b);
    // })();

    // var a = 99;
    // foo();
    // console.log(a);
    // function foo() {
    //   console.log(a);
    //   var a = 10;
    //   console.log(a);
    // }
    // // 这里考变量提升
    // 这里的变量提升是这样的
    // var a undefined
    // function foo(){
    //     console.log(a);
    //     var a = 10
    //     console.log(a);

    //     这里面这个作用域的变量提升
    //     var a undefined
    //     console.log(a); // undefined
    //     var a = 10
    //     console.log(a); 10
    // }

    // console.log(a); 这时候是全局的所以是99 变量提升

    // function test() {
    //   var a = 1;
    //   if (true) {
    //     console.log(a); // 输出？ 1
    //     var a = 2;
    //     console.log(a); // 输出？ 2
    //   }
    // }
    // test();

    // console.log(a); // 输出？   function a() {}
    // var a = 1;
    // function a() {}

    // 这里的变量提升后是这样的
    // var a = undefined
    // function a(){}
    // console.log(a); // 所以打印出来是a函数

    // console.log(a); // 输出？
    // const a = 3; // 因为有声明const 直接就报错
    // var a = 4; //

    // for (var i = 0; i < 3; i++) {
    //   setTimeout(() => console.log(i), 1000);
    // }

    // for (let j = 0; j < 3; j++) {
    //   setTimeout(() => console.log(j), 1000);
    // }

    // 第五题

    // var x = 1;
    // function outer() {
    //   console.log(x); // 输出？ undefined
    //   var x = 2;
    //   function inner() {
    //     console.log(x); // 输出？ 2
    //     x = 3;
    //   }
    //   inner();
    //   console.log(x); // 输出？3
    // }
    // outer();
    // console.log(x); // 输出？1

    // 提升后
    // var x = undefined
    // function outer(){
    //     var x = undefined
    // console.log(x);
    // x = 2

    //     function inner(){
    //         console.log(x); // 输出2
    //         x = 3
    //     }
    //     x = 2
    //     immer()
    //     console.log(x); // 输出 3
    // }
    // x = 1
    // outer()
    // console.log(x); 输出1

    // 第六题
    // foo(); // 输出？ 函数表达式不会提升所以报错没有找到函数
    // bar(); // 输出？bar

    // 函数表达式不会提升
    // var foo = function () {
    //   console.log("foo");
    // };
    // function bar() {
    //   console.log("bar");
    // }

    // console.log(a); // 输出？ undefined  因为下面的条件语句是块级作用域无法访问，但是直接在浏览器里使用输出的是a函数
    // if (true) {
    //   function a() {
    //     console.log("block");
    //   }
    // }

    async function async1() {
      console.log('async1 start');
      await async2();
      console.log('async1 end');
    }
    async function async2() {
      console.log('async2');
    }

    console.log('script start');

    setTimeout(function () {
      console.log('setTimeout');
    }, 0);

    async1();

    new Promise(function (resolve) {
      console.log('promise1');
      resolve();
    }).then(function () {
      console.log('promise2');
    });
    console.log('script end');

    // console.log(
    //   'script start',
    //   'async1 start',
    //   'async2',
    //   'promise1',
    //   'script end',
    //   'async1 end',
    //   'promise2',
    //   'setTimeout'
    // );
  </script>
  <body></body>
</html>
